package com.lb.jwitter.service;

import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.jws.WebService;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JSONSerializer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.lb.jwitter.*;
import com.lb.jwitter.hibernate.*;
import com.lb.jwitter.util.ChumanoLogger;
import com.lb.jwitter.util.ConditionReport;

@Service("tbl_ThongTin_HocVien_MonHocService")
@Transactional
@WebService(endpointInterface = "com.lb.jwitter.service.Tbl_ThongTin_HocVien_MonHocService")
public class Tbl_ThongTin_HocVien_MonHocServiceImpl implements
		Tbl_ThongTin_HocVien_MonHocService, Serializable {

	private Log log = LogFactory
			.getLog(Tbl_ThongTin_HocVien_MonHocServiceImpl.class);
	private static final long serialVersionUID = -8740095022264495229L;

	@Autowired
	@Qualifier("tbl_ThongTin_HocVien_MonHocDAO")
	private Tbl_ThongTin_HocVien_MonHocDAO _tbl_ThongTin_HocVien_MonHocDao;

	@Autowired
	@Qualifier("tbl_ThongTin_HocVienDAO")
	private Tbl_ThongTin_HocVienDAO _tbl_ThongTin_HocVienDao;

	@Autowired
	@Qualifier("tbl_CTDT_MonHocDAO")
	private Tbl_CTDT_MonHocDAO _tbl_CTDT_MonHocDao;

	public final List<Tbl_ThongTin_HocVien_MonHoc> findAlltbl_ThongTin_HocVien_MonHoc(
			int pageSize, int page) {
		List<Tbl_ThongTin_HocVien_MonHoc> result = get_tbl_ThongTin_HocVien_MonHocDao()
				.findAll(pageSize, page);
		log.info("Number of user in DB:: " + result.size());
		return result;
	}

	@Transactional(noRollbackFor = IllegalArgumentException.class)
	public final Long createtbl_ThongTin_HocVien_MonHoc(
			Tbl_ThongTin_HocVien_MonHoc obj) {
		return _tbl_ThongTin_HocVien_MonHocDao.save(obj);
	}
	
	public void createListtbl_ThongTin_HocVien_MonHocByJSON(String data) {
		try {
			ChumanoLogger.init(Tbl_ThongTin_HocVien_MonHocServiceImpl.class.getName());
			ChumanoLogger.log("0BAT DAU INSERT DU LIEU");
			List<Tbl_ThongTin_HocVien_MonHoc> tbl_ThongTin_HocVien_MonHocs = new ArrayList<Tbl_ThongTin_HocVien_MonHoc>();

			JSONArray jsons = (JSONArray) JSONSerializer.toJSON(data);
			ArrayList<String> notMonHocs = new ArrayList<String>();
			ArrayList<String> notSVs = new ArrayList<String>();
			
			for (int i = 0; i < jsons.size(); i++) {
				JSONObject obj = jsons.getJSONObject(i);
				String logStr ="";
				//-------------------------------------
				//Lay du lieu
				String mssv = obj.getString("MSSV");
				String maMH = obj.getString("MAMONHOC");
				String trangthai = obj.getString("TRANGTHAI");
				
				logStr ="[ " + (i+1)+ " - " 
				+ "MSSV: " + mssv + " - " 
				+ "MAMH: " + maMH + " - " 
				+ "TT: " + trangthai 
				+ "]";
				//=====================================
				// kiem tra mshv co ton tai hay khong
				List<ConditionReport> cons = new ArrayList<ConditionReport>();
				{
					ConditionReport con = new ConditionReport();
					con.setCol("hocVienId.MSSV");
					con.setValue1(mssv);
					con.setOperator("eq");
					cons.add(con);
				}
				{

					ConditionReport con = new ConditionReport();
					con.setCol("monHocId.ma");
					con.setValue1(maMH);
					con.setOperator("eq");
					cons.add(con);
				}
				List<Tbl_ThongTin_HocVien_MonHoc> thongTinHocVienMonHoc = _tbl_ThongTin_HocVien_MonHocDao.findByCondition(Tbl_ThongTin_HocVien_MonHoc.class,cons, 1, 1);

				// neu ket qua da co=> cap nhat ket qua
				if (thongTinHocVienMonHoc != null&& thongTinHocVienMonHoc.size() > 0) {
					thongTinHocVienMonHoc.get(0).setTrangThai(trangthai);
					// _tbl_ThongTin_HocVien_MonHocDao.saveOrUpdate(tblThongTinHocVienMonHoc);

					tbl_ThongTin_HocVien_MonHocs.add(thongTinHocVienMonHoc.get(0));

				}
				// neu chua co ket qua => insert
				else 
				{
					Tbl_ThongTin_HocVien_MonHoc tblThongTinHocVienMonHoc = new Tbl_ThongTin_HocVien_MonHoc();

					cons.clear();
					{
						ConditionReport con = new ConditionReport();
						con.setCol("MSSV");
						con.setValue1(mssv);
						con.setOperator("eq");
						cons.add(con);
					}
					List<String> columns = new ArrayList<String>();
					columns.add("id");
					List<Long> hocVienId = _tbl_ThongTin_HocVienDao.findColumnByCondition(Tbl_ThongTin_HocVien.class,cons, columns, 1, 1);

					cons.clear();
					{
						ConditionReport con = new ConditionReport();
						con.setCol("ma");
						con.setValue1(maMH);
						con.setOperator("eq");
						cons.add(con);
					}
					List<Long> monHocId = _tbl_CTDT_MonHocDao.findColumnByCondition(Tbl_CTDT_MonHoc.class, cons,columns, 1, 1);

					// neu ton tai hoc vien co mssv va ton tai mon hoc co ma mon
					// hoc thi insert
					if (hocVienId != null && hocVienId.size() > 0 ) {
						if(monHocId != null && monHocId.size() > 0){
							Tbl_ThongTin_HocVien hocVien = new Tbl_ThongTin_HocVien();							
							hocVien.setId(hocVienId.get(0));
							Tbl_CTDT_MonHoc monHoc = new Tbl_CTDT_MonHoc();
							monHoc.setId(monHocId.get(0));
						
							
							tblThongTinHocVienMonHoc.setHocVienId(hocVien);
							tblThongTinHocVienMonHoc.setMonHocId(monHoc);
							tblThongTinHocVienMonHoc.setTrangThai(trangthai);
							//if (trangthai.trim().equals("1"))
								//tblThongTinHocVienMonHoc.setTrangThai("1");
							//else
								//tblThongTinHocVienMonHoc.setTrangThai("0");
	
							tbl_ThongTin_HocVien_MonHocs.add(tblThongTinHocVienMonHoc);
						} else{
							logStr +=" NOT MAMH";
							if(!notMonHocs.contains(maMH)) notMonHocs.add(maMH);
						}
					}
					else{
						logStr +=" NOT MSSV";
						if(!notSVs.contains(mssv)) notSVs.add(mssv);
					}
				}// if
				
				
				ChumanoLogger.log(logStr);
			}// end for

			_tbl_ThongTin_HocVien_MonHocDao.saveOrUpdateAll(tbl_ThongTin_HocVien_MonHocs);
			//-------------------------
			
			ChumanoLogger.log("===================== not monhoc=======================");
			reportArrayString(notMonHocs);
			ChumanoLogger.log("===================== not mssv=======================");
			reportArrayString(notSVs);
		} catch (Exception e) {
			ChumanoLogger.log("ERROR: " +e.getMessage());
			   System.out.println("------------ERROR CHUMANO-------------");
			   e.printStackTrace();
			   System.out.println("=================================");
		}
		   
		ChumanoLogger.stop();
	}
	
	public void createListtbl_ThongTin_HocVien_MonHocByJSON1(String data) {
		try {
			ChumanoLogger.init(Tbl_ThongTin_HocVien_MonHocServiceImpl.class.getName());
			ChumanoLogger.log("0BAT DAU INSERT DU LIEU");
			List<Tbl_ThongTin_HocVien_MonHoc> tbl_ThongTin_HocVien_MonHocs = new ArrayList<Tbl_ThongTin_HocVien_MonHoc>();

			JSONArray jsons = (JSONArray) JSONSerializer.toJSON(data);
			ArrayList<String> notMonHocs = new ArrayList<String>();
			
			for (int i = 0; i < jsons.size(); i++) {
				JSONObject obj = jsons.getJSONObject(i);
				String logStr ="";
				//-------------------------------------
				//Lay du lieu
				String mssv = obj.getString("MSSV");
				String maMH = obj.getString("MAMONHOC");
				String trangthai = obj.getString("TRANGTHAI");
				
				logStr ="[ " + (i+1)+ " - " 
				+ "MSSV: " + mssv + " - " 
				+ "MAMH: " + maMH + " - " 
				+ "TT: " + trangthai 
				+ "]";
				//=====================================
				// kiem tra mshv co ton tai hay khong
				List<ConditionReport> cons = new ArrayList<ConditionReport>();
				{
					ConditionReport con = new ConditionReport();
					con.setCol("hocVienId.MSSV");
					con.setValue1(mssv);
					con.setOperator("eq");
					cons.add(con);
				}
				{

					ConditionReport con = new ConditionReport();
					con.setCol("monHocId.ma");
					con.setValue1(maMH);
					con.setOperator("eq");
					cons.add(con);
				}
				List<Tbl_ThongTin_HocVien_MonHoc> thongTinHocVienMonHoc = _tbl_ThongTin_HocVien_MonHocDao.findByCondition(Tbl_ThongTin_HocVien_MonHoc.class,cons, 1, 1);

				// neu ket qua da co=> cap nhat ket qua
				if (thongTinHocVienMonHoc != null&& thongTinHocVienMonHoc.size() > 0) {
					thongTinHocVienMonHoc.get(0).setTrangThai(trangthai);
					tbl_ThongTin_HocVien_MonHocs.add(thongTinHocVienMonHoc.get(0));

				}
				// neu chua co ket qua => insert
				else {
					Tbl_ThongTin_HocVien_MonHoc tblThongTinHocVienMonHoc = new Tbl_ThongTin_HocVien_MonHoc();

					cons.clear();
					{
						ConditionReport con = new ConditionReport();
						con.setCol("MSSV");
						con.setValue1(mssv);
						con.setOperator("eq");
						cons.add(con);
					}
					List<String> columns = new ArrayList<String>();
					columns.add("id");
					List<Long> hocVienId = _tbl_ThongTin_HocVienDao.findColumnByCondition(Tbl_ThongTin_HocVien.class,cons, columns, 1, 1);

					cons.clear();
					{
						ConditionReport con = new ConditionReport();
						con.setCol("ma");
						con.setValue1(maMH);
						con.setOperator("eq");
						cons.add(con);
					}
					List<Long> monHocId = _tbl_CTDT_MonHocDao.findColumnByCondition(Tbl_CTDT_MonHoc.class, cons,columns, 1, 1);

					// neu ton tai hoc vien co mssv va ton tai mon hoc co ma mon
					// hoc thi insert
					if (hocVienId != null && hocVienId.size() > 0 ) {
						if(monHocId != null && monHocId.size() > 0){
							Tbl_ThongTin_HocVien hocVien = new Tbl_ThongTin_HocVien();							
							hocVien.setId(hocVienId.get(0));
							
							tblThongTinHocVienMonHoc.setHocVienId(hocVien);
							Tbl_CTDT_MonHoc monHoc = new Tbl_CTDT_MonHoc();
							monHoc.setId(monHocId.get(0));
							tblThongTinHocVienMonHoc.setMonHocId(monHoc);
							tblThongTinHocVienMonHoc.setTrangThai(trangthai);
							//if (trangthai.trim().equals("1"))
								//tblThongTinHocVienMonHoc.setTrangThai("1");
							//else
								//tblThongTinHocVienMonHoc.setTrangThai("0");
	
							tbl_ThongTin_HocVien_MonHocs.add(tblThongTinHocVienMonHoc);
						} else{
							logStr +=" NOT MAMH";
							if(!notMonHocs.contains(maMH)) notMonHocs.add(maMH);
						}
					}
					else
						logStr +=" NOT MSSV";
				}// if
				
				
				ChumanoLogger.log(logStr);
			}// end for

			_tbl_ThongTin_HocVien_MonHocDao.saveOrUpdateAll(tbl_ThongTin_HocVien_MonHocs);
			//-------------------------
			
			ChumanoLogger.log("===================== not monhoc=======================");
			reportArrayString(notMonHocs);
			
		} catch (Exception e) {
			ChumanoLogger.log("ERROR: " +e.getMessage());
			   System.out.println("------------ERROR CHUMANO-------------");
			   e.printStackTrace();
			   System.out.println("=================================");
		}
		   
		ChumanoLogger.stop();
	}
	
	static void reportArrayString(ArrayList<String> arr){
		int i =1;
		for(String str :arr){
			ChumanoLogger.log(i + ". " + str);
			i++;
		}
	}

	public final void updatetbl_ThongTin_HocVien_MonHoc(
			Tbl_ThongTin_HocVien_MonHoc obj) {
		_tbl_ThongTin_HocVien_MonHocDao.update(obj);
	}// end update methode

	public final Tbl_ThongTin_HocVien_MonHoc gettbl_ThongTin_HocVien_MonHoc(
			Long id) {
		log.info("Try to retrieve the tbl_ThongTin_HocVien_MonHoc: " + id);
		return get_tbl_ThongTin_HocVien_MonHocDao().get(id);
	}

	public void deletetbl_ThongTin_HocVien_MonHoc(Long id) {
		log.info("Try to delete the tbl_ThongTin_HocVien_MonHoc by Id : " + id);
		if (_tbl_ThongTin_HocVien_MonHocDao.exists(id)) {
			_tbl_ThongTin_HocVien_MonHocDao.delete(id);
		} else {
			throw new IllegalArgumentException("EmployeeId '" + id
					+ "' does not exists");
		}
	}

	public void deleteListtbl_ThongTin_HocVien_MonHoc(String[] listId) {
		for (String id : listId) {
			deletetbl_ThongTin_HocVien_MonHoc(Long.parseLong(id));
		}
	}

	public List<Tbl_ThongTin_HocVien_MonHoc> findtbl_ThongTin_HocVien_MonHocByCondition(
			List<ConditionReport> cons, int pageSize, int page) {
		return _tbl_ThongTin_HocVien_MonHocDao.findByCondition(
				Tbl_ThongTin_HocVien_MonHoc.class, cons, pageSize, page);
	}

	public List<Object> findColumntbl_ThongTin_HocVien_MonHocByCondition(
			List<ConditionReport> cons, List<String> columns, int pageSize,
			int page) {

		return _tbl_ThongTin_HocVien_MonHocDao.findColumnByCondition(
				Tbl_ThongTin_HocVien_MonHoc.class, cons, columns, pageSize,
				page);
	}

	public int counttbl_ThongTin_HocVien_MonHocByCondition(
			List<ConditionReport> cons) {
		return _tbl_ThongTin_HocVien_MonHocDao.countByCondition(
				Tbl_ThongTin_HocVien_MonHoc.class, cons);
	}

	public final Tbl_ThongTin_HocVien_MonHocDAO get_tbl_ThongTin_HocVien_MonHocDao() {
		return _tbl_ThongTin_HocVien_MonHocDao;
	}

	public final void set_tbl_ThongTin_HocVien_MonHocDao(
			Tbl_ThongTin_HocVien_MonHocDAO obj) {
		this._tbl_ThongTin_HocVien_MonHocDao = obj;
	}

	public Tbl_ThongTin_HocVienDAO get_tbl_ThongTin_HocVienDao() {
		return _tbl_ThongTin_HocVienDao;
	}

	public void set_tbl_ThongTin_HocVienDao(
			Tbl_ThongTin_HocVienDAO _tbl_ThongTin_HocVienDao) {
		this._tbl_ThongTin_HocVienDao = _tbl_ThongTin_HocVienDao;
	}

	public Tbl_CTDT_MonHocDAO get_tbl_CTDT_MonHocDao() {
		return _tbl_CTDT_MonHocDao;
	}

	public void set_tbl_CTDT_MonHocDao(Tbl_CTDT_MonHocDAO _tbl_CTDT_MonHocDao) {
		this._tbl_CTDT_MonHocDao = _tbl_CTDT_MonHocDao;
	}

	
	
	public String CalSPKiemTraKetQuaMonHoc(String mssv, String maMonHoc ){
		return _tbl_ThongTin_HocVien_MonHocDao.CalSPKiemTraKetQuaMonHoc(mssv, maMonHoc);
	}
}// endclass

